﻿using System;
using System.Collections.Generic;
using System.Text;

namespace csharpcore7_ch4_generic_delegate
{
    class DelegateGeneric_Example1
    {
        static void _Main(string[] args)
        {
            int[] values = { 1, 2, 3 };
            Util.Transform(values, Square);
            foreach (int i in values)
            {
                Console.Write(i + " ");//1 4 9
            }
        }
        static int Square(int x) => x * x;
    }
    public delegate T Transformer<T>(T arg);
    class Util
    {
        /// <summary>
        /// Transform方法接收一个泛型数组，传递一个变化方法修改数组中的数据
        /// 使用方法，传递一个数组，并传递一个转换方法。比如求平方，或求立方
        /// 结果，根据转换方法将源数组进行转换。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="values"></param>
        /// <param name="transformer">返回T类型的Func委托</param>
        public static void Transform<T>(T[] values, Transformer<T> transformer)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = transformer(values[i]);
            }
        }
    }
}
